#include <xscript/xprint.h>
#include <astree/xabstractsyntaxtreelet.h>

XAbstractSyntaxTreeLet::XAbstractSyntaxTreeLet(XTokenPtr inputToken):
    XAbstractSyntaxTreeN<2>(inputToken) {
    setName(L"let");
}

bool XAbstractSyntaxTreeLet::invokeImpl(std::shared_ptr<XVariableTable> table) {
    auto varNode = getChildAt(0);
    auto valueNode = getChildAt(1);

    if (!valueNode->invoke(table))
        return false;

    auto value = valueNode->getResult();

    if (!swtichVariableTable(table, varNode->getToken()->getModuleName(), varNode->getToken()->getBlock()))
        return false;

    if (!table->addVariable(varNode->getToken()->getString(), value))
        return false;

    result = value;
    return true;
}
